package mpbe.geometria;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

public class Recta_Punto_Pend {
	// ecuacion Y = tg * X + h
	private double tg; //tangente de la recta
	private double h; //altura de la recta
	private Punto vd; //crear clase vector y cambiar por clase vector //vector direccion
	
	
	//*****************************************************
	// Constructores
	//*****************************************************
	public Recta_Punto_Pend(double tg, double h) {
		this.tg = tg;
		this.h = h;
		this.vd = new Punto (1, getY(1));
	}
	
	public Recta_Punto_Pend(Punto P1, Punto P2) {
		setRecta(P1, P2);
		
	}


	//*****************************************************
	// Fundiones de la Recta
	//*****************************************************
	public void setRecta (Punto P1, Punto P2) {
		// Y = tg*X+h
		// devuelve un punto donde X es m, tg de la recta
		// y Y es h, la altura
		double Vx = P2.getX() - P1.getX(); //vector direccion X
		double Vy = P2.getY() - P1.getY(); //vector direccion Y
		//double R = Math.sqrt(Vx*Vx+Vy*Vy);
		tg = Vy/Vx; 
		h = P2.getY()-tg*P2.getX();
		vd = new Punto(Vx ,Vy);
	}
	public void setRecta (double tg, double h) {
		this.tg = tg;
		this.h = h;
	}
	
	public Punto getCoefRecta () {
		return new Punto(tg, h);
	}
	
	public double getY (double X) {
		return (tg*X+h);
	}
	public double getX (double Y) {
		return ((Y-h)/tg);
	}
	
	public double getTg() {
		return tg;
	}
	public void setTg(double tg) {
		this.tg = tg;
	}

	public double getH() {
		return h;
	}
	public void setH(double h) {
		this.h = h;
	}

	public Recta_Punto_Pend Recta_Paralela (double dist) {
		// calcula los coef de la recta paralela a la distancia dadda
		// la ecuacion de la recta paralela queda dada por Y = X*Tg(rad) + hp
		double rad = Math.atan(tg); //angulo de la recta en rad
		double cos = Math.cos(rad);
		double Yh = cos*dist; //Ver que pasa aca con el signo de distancia
		double hp = h + Yh;
		
		return new Recta_Punto_Pend(tg, hp);
	}
	
	public Recta_Punto_Pend Recta_Paralela (Punto P1, Punto P2, double dist) {
		// calcula los coef de la recta paralela a la distancia dadda
		// la ecuacion de la recta paralela queda dada por Y = X*Tg(rad) + hp
		double Vx = P2.getX() - P1.getX(); //vector direccion X
		double Vy = P2.getY() - P1.getY(); //vector direccion Y
		double R = Math.sqrt(Vx*Vx+Vy*Vy); //radio vector

		double tg = Vy/Vx; 
		double h = P2.getY()-tg*P2.getX();
		
		double cos = Vy/R/tg;
		double Yh = cos*dist; //Ver que pasa aca con el signo de distancia
		double hp = h + Yh;
		
		return new Recta_Punto_Pend(tg, hp);
	}
	
	public Recta_Punto_Pend Recta_Paralela (Punto P) {
		double hp = P.getY()-tg*P.getX();
		return new Recta_Punto_Pend(tg, hp);
	}
	
	public Punto interseccion(double tg2, double h2) {
		Punto Pi = new Punto();
		Pi.setX((h2-h)/(tg-tg2));
		Pi.setY(tg2*Pi.getX()+h2);
		return Pi;
	}
	public Punto interseccion(Recta_Punto_Pend recta2) {
		return interseccion(recta2.getTg(), recta2.getH());
	}
	
}
